package day02;
/**
 * 基本数据类型和类型间的转换
 * @author XingHaiYang
 * @date 2022/9/5 10:30
 */
public class DataTypeDemo {
    public static void main(String[] args) {
        // 01类型间的转换:
        /*
         * 两点规则：
         *   整数直接量可以直接赋值给byte,short,char，但不能超出范围
         *   byte,short,char型数据参与运算时，系统会一律先将其转为int再运算
         * */
        byte b1 = 5;
        byte b2 = 6;
        byte b3 = (byte)(b1+b2);
        System.out.println(2+2);     //4
        System.out.println(2+'2');   //52，2加上'2'的码50
        System.out.println('2'+'2'); //100，'2'的码50，加上'2'的码50
        int w = '我';
        System.out.println(w); //25105，'我'所对应的码
        // 数据类型由小到大依次为：byte<short<int<long<float<double
        /*
        * 两种方式：
        *   自动/隐式类型转换：小类型转为大类型
        *   强制类型转换：大类型转为小类型
        *       语法：(要转换成为的数据类型)变量
        *       注意：强转有可能溢出或丢失精度
        * */
        int a100 = 5;
        long b100 = a100; //自动类型转换(小到大)
        int c100 = (int)b100; //强制类型转换(大到小)

        long d100 = 5; //自动类型转换
        double e100 = 5; //自动类型转换

        double f100 = 25.987;
        int g100 = (int)f100;
        System.out.println(g100); //25，强转有可能丢失精度
        long h100 = 10000000000L;
        int i100 = (int)h100;
        System.out.println(i100); //1410065408，强转有可能发生溢出

        // 02 int：整型，4个字节，-21个多亿到21个多亿
        // 整数直接量默认为int类型，但不能超出范围，若超范围则发生编译错误
        int a6 = 250; //250为整数直接量，默认为int类型
        //int b = 10000000000; //编译错误，100亿默认为int类型，但超出int范围了
        //int c = 3.14; //编译错误，数据类型不匹配

        // 两个整数相除，结果还是整数，小数位无条件舍弃(不会四舍五入)
        System.out.println(5/2);   //2
        System.out.println(2/5);   //0
        System.out.println(5/2.0); //2.5

        // 运算时，若超范围则发生溢出，溢出不是错误，但是需要避免
        int d7 = 2147483647; //int的最大值
        d7 = d7+1;
        System.out.println(d7); //-2147483648，发生溢出了，溢出需要避免

        // 03 long：长整型，8个字节，-900万万亿多到900万万亿多
        // 长整型的直接量需在数字后加L或l
        long l = 125L; //125L为长整型直接量
        //long b = 10000000000; //编译错误，100亿默认为int类型，但超出int范围了
        long c = 10000000000L; //100亿L为长整型
        // 运算时若有可能溢出，建议在第1个数字后加L
        long l2 = 1000000000*2*10L;
        System.out.println(l2); //200亿
        long e = 1000000000*3*10L;
        System.out.println(e); //不是300亿
        long f = 1000000000L*3*10;
        System.out.println(f); //300亿

        // 04 double、float：浮点型，8个字节，很大很大很大
        // 小数直接量默认为double型，若想表示float，需在数字后加F或f
        double dou = 3.14; //3.14为小数直接量，默认为double类型
        float b = 3.14F; //3.14F为float直接量
        // 不能表示精确数字，运算时有可能会发生舍入误差，精确场合不能使用
        double c1=3.0,d1=2.9;
        System.out.println(c1-d1); //0.10000000000000009，有可能发生舍入误差

        // 05 boolean：布尔型，1个字节
        // 只能存储true或false
        boolean a5 = true;  //true为布尔型直接量
        boolean b5 = false; //false为布尔型直接量
        //boolean c = 250; //编译错误，布尔型只能存储true或false

        // 06 char：字符型，2个字节
        // 采用Unicode编码格式，一个字符对应一个码
        // 表现的形式是字符char，但本质上是码int (0到65535)
        // (ASCII码：'a'----97   'A'----65    '0'----48)
        // 字符直接量必须放在单引号中，只能有1个
        char c11 = '女'; //字符女
        char c2 = 'f';  //字符f
        char c3 = '6';  //字符6
        char c4 = '*';  //字符*
        //char c5 = 女; //编译错误，字符直接量必须放在单引号中
        //char c6 = ''; //编译错误，必须有字符
        //char c7 = '10'; //编译错误，只能有一个字符
        char c8 = 65; //0到65535之间
        System.out.println(c8); //println()输出时会依据c8的类型来输出展示
        //若c8是char型，则以字符形式输出
        //若c8是int型，则以数字形式输出
        // 特殊符号需要通过\来转义
        char c9 = '\'';
        System.out.println(c9); //'
    }
}
